(*p)[2]指针变量的不懂,拜托大家了

来源:百度知道 编辑:UC知道 时间:2024/05/14 19:25:22
以下程序的输出结果是
static int a[2][3]={1,2,3,4,5,6},
(*p)[2],I;
p=a;
for(I=0;I<3;I++)
printf(“%d”, *(*(p+1)+I));
A 输出不确定 B 3 4 5
C 2 3 4 D 4 5 6

答案是A拉,麻烦请说明一下 原因,谢谢

你的程序我调试了一下,编译可以通过结果为 3 4 5

问题我分析了一下,(*p)[N]表示的是指向一个二维数组,这个数组是多少行不需要确定,但是这个数组必须是N列的,即每行必须是N各元素,才是对应的结构

在你的程序里定义(*p)[2]
p=a; 指向了的结构和指针本身定义的结构不符,会出现警告,但是编译是可以通过的。

此时
*(p+1) 相当于 顺序移位了4个字节,因为对其的定义是每行两个整形元素
所以*(p+1) 指向 元素 “3”因此输出是 “3,4,5”

若定义改为(*p)[3],那么定义是每行三个元素
所以*(p+1) 相当于 顺序移位了6个字节,移动了三个元素,
此时*(p+1) 指向 元素 “4”因此输出是 “4,5,6”

若定义改为(*p)[4],那么定义是每行4个元素
所以*(p+1) 相当于 顺序移位了8个字节,移动了4个元素,
此时*(p+1) 指向 元素 “5”因此输出是 “5,6,?”

我想通过这样举例,楼主应该简单的理解了指向二维数组的指针了吧

程序本身就有错误 a不能直接赋值给P 要进行类型转换 (int(*)[2])a
转换了之后答案也不是A阿 就是p[1][0] p[1][1] p[2][1]输出阿 结果是 3 4 5

请注意下程序这里
static int a[2][3]={1,2,3,4,5,6};//两行三列的二维数组
(*p)[2],I; //而这里声明的是一个指针P,这个指针指向的是包含2个整型元素的一维数组
p=a; //这里让P指向a,会报错的,因为a代表的是含有3个元素的一维数组,不匹配

程序本身有错误

将(*p)[2]改为(*p)[3]
程序就通过了
结果是456

三楼正解.